﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.Remoting.Messaging;
using System.Threading;
using System.Diagnostics;
using System.Data.SqlClient;

namespace 多线程
{
    public partial class DXC2 : Form
    {
        public DXC2()
        {
            InitializeComponent();
        }

        #region timer数数 该操作在仍同一个线程内
        private void btnTimer_Click(object sender, EventArgs e)
        {
            System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
            timer.Tick += new EventHandler(timer_Tick);
            timer.Start();
        }

        void timer_Tick(object sender, EventArgs e)
        {
            ProcessTimer();
        }

        void ProcessTimer()
        {
            if (i < 1000000)
            {
                i += 10;
                txtName.Text = i.ToString();
                //如果没有加上 DoEvents的话，由于循环时间会比较久就会出现假死的状态，而且程序不能处理其他的事件。
                //而如果加上DoEvents的话就会对文本框的值实时响应，给用户带来较好的用户体验,如果CPU较高不要也不会出现假死
                Application.DoEvents();
            }
        }
        #endregion

        #region thread数数 该操作在新线程内
        private void btnNewThread_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(ProcessThread);
            t.Start();
        }

        void ProcessThread()
        {
            while (i < 1000000)
            {
                i += 10;
                txtName.Text = i.ToString();
                //如果没有加上 DoEvents的话，由于循环时间会比较久就会出现假死的状态，而且程序不能处理其他的事件。
                //而如果加上DoEvents的话就会对文本框的值实时响应，给用户带来较好的用户体验，如果CPU较高不要也不会出现假死
                Application.DoEvents();
            }
        }
        #endregion

        #region 新线程内:回调函数的使用
        delegate bool addDelegate();
        private void btnProgressBar_Click(object sender, EventArgs e)
        {
            bgwBar.Maximum = 10000;
            addDelegate adddele = this.dos;
            IAsyncResult asy = adddele.BeginInvoke(OnCompete, bgwBar);
        }

        private void btnProgressBar2_Click(object sender, EventArgs e)
        {
            bgwBar.Maximum = 10000;
            addDelegate adddele = this.dos;
            IAsyncResult asy = adddele.BeginInvoke(null, bgwBar);
            bool isCom = adddele.EndInvoke(asy);
            Debug.Assert(!isCom);
        }

        void OnCompete(IAsyncResult asy)
        {
            AsyncResult asss = asy as AsyncResult;
            MessageBox.Show("Test" + ((ProgressBar)asss.AsyncState).Value.ToString());
        }

        int i = 0;
        bool dos()
        {
            while (i < 10000)
            {
                i++;
                label1.Text = i.ToString();
                bgwBar.Value = i;
            }
            return true;
        }

        #endregion
    }
}